﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;

using ERPStore.Web.Html;
using ERPStore.Web.Routing;
using ERPStore.Web.Extensions;

using ERPStore.Extensions;

namespace ERPStore.Web.Html
{
	/// <summary>
	/// Methodes d'extension permettant la gestion d'un chemin de fer
	/// </summary>
	public static class BreadCrumbExtensions
	{
		/// <summary>
		/// Retourne la liste des liens sous la forme Clé/Url pour former un 
		/// chemin de fer lorsque le model en cours est une liste de categorie de produits
		/// </summary>
		/// <param name="helper">The helper.</param>
		/// <param name="list">The list.</param>
		/// <returns></returns>
		public static IList<ERPStore.Models.BreadCrumbItem> GetBreadcrumb(this UrlHelper helper, IList<ERPStore.Models.ProductCategory> list)
		{
			var result = helper.CreateDefaultBreadcrumb();
			result.Add(new ERPStore.Models.BreadCrumbItem()
			{
				Title= "Catégories", 
				Url = helper.RouteERPStoreUrl(ERPStoreRoutes.PRODUCT_CATEGORIES),
				Type = "Categories",
				Description = "Toutes les catégories",
			});
			return result;
		}

		/// <summary>
		/// Retourne la liste des liens sous la forme Clé/Url pour former un
		/// chemin de fer lorsque le model en cours est une categorie de produits
		/// </summary>
		/// <param name="helper">The helper.</param>
		/// <param name="category">The category.</param>
		/// <returns></returns>
		public static IList<ERPStore.Models.BreadCrumbItem> GetBreadcrumb(this UrlHelper helper, ERPStore.Models.ProductCategory category)
		{
			var result = helper.GetBreadcrumb(new List<ERPStore.Models.ProductCategory>());
			if (category == null)
			{
				return result;
			}

			// On depile le path
			var path = new List<ERPStore.Models.BreadCrumbItem>();
			path.Add(new ERPStore.Models.BreadCrumbItem()
			{
				Title = category.BreadCrumbName ?? category.ExtendedName ?? category.Name,
				Url = helper.Href(category),
				Type = "Category",
				Description = category.Description,
				Code = category.Code,
			});
			var c = category.Parent;
			while(true)
			{
				if (c != null)
				{
					if (!path.Any(i => i.Title == (c.BreadCrumbName ?? c.ExtendedName ?? c.Name)))
					{
						path.Add(new ERPStore.Models.BreadCrumbItem()
						{
							Title = c.BreadCrumbName ??	c.ExtendedName ?? c.Name,
							Url = helper.Href(c),
							Type = "Category",
							Description = c.Description,
							Code = c.Code,
						});
					}
				}
				else
				{
					break;
				}
				c = c.Parent;
			}

			// Ajout inverse du plus grand au plus petit
			path.Reverse();
			foreach (var item in path)
			{
				result.Add(item);
			}

			return result;
		}

		/// <summary>
		/// Retourne la liste des liens sous la forme Clé/Url pour former un
		/// chemin de fer lorsque le model en cours est un produit
		/// </summary>
		/// <param name="helper">The helper.</param>
		/// <param name="product">The product.</param>
		/// <returns></returns>
		public static IList<ERPStore.Models.BreadCrumbItem> GetBreadcrumb(this UrlHelper helper, ERPStore.Models.Product product)
		{
			var result = helper.CreateDefaultBreadcrumb();
			if (product.Category != null)
			{
				result.Clear();
				var list = helper.GetBreadcrumb(product.Category);
				foreach (var item in list)
				{
					result.Add(new ERPStore.Models.BreadCrumbItem()
					{
						Title = item.Title, 
						Url = item.Url,
						Type = item.Type,
						Description = item.Description,
						Code = item.Code,
					});
				}
			}

			result.Add(new ERPStore.Models.BreadCrumbItem()
			{
				Title = product.Title, 
				Url = helper.Href(product),
				Type = "Product",
				Description = product.ShortDescription,
				Code = product.Code,
			});

			return result;
		}

		/// <summary>
		/// Retourne la liste des liens sous la forme Clé/Url pour former un 
		/// chemin de fer lorsque le model en cours est une liste de marque
		/// </summary>
		/// <param name="helper">The helper.</param>
		/// <param name="list">The list.</param>
		/// <returns></returns>
		public static IList<ERPStore.Models.BreadCrumbItem> GetBreadcrumb(this UrlHelper helper, IList<ERPStore.Models.Brand> list)
		{
			var result = helper.CreateDefaultBreadcrumb();
			result.Add(new ERPStore.Models.BreadCrumbItem()
			{
				Title = "Marques",
				Url = helper.BrandsHref(),
				Description = "Des grandes marques",
				Type = "Brands",
			});
			return result;
		}

		/// <summary>
		/// Retourne la liste des liens sous la forme Clé/Url pour former un
		/// chemin de fer lorsque le model en cours est une marque
		/// </summary>
		/// <param name="helper">The helper.</param>
		/// <param name="brand">The brand.</param>
		/// <returns></returns>
		public static IList<ERPStore.Models.BreadCrumbItem> GetBreadcrumb(this UrlHelper helper, ERPStore.Models.Brand brand)
		{
			var result = helper.GetBreadcrumb(new List<ERPStore.Models.Brand>());

			result.Add(new ERPStore.Models.BreadCrumbItem()
			{
				Title = brand.Name,
				Url = helper.Href(brand),
				Description = brand.PageDescription,
				Type = "Brand",
				Code = brand.Name,
			});

			return result;
		}

		/// <summary>
		/// Retourne la liste des liens sous la forme Clé/Url pour former un 
		/// chemin de fer lorsque le model en cours est une recherche de produits
		/// </summary>
		/// <param name="helper">The helper.</param>
		/// <param name="search">The search.</param>
		/// <returns></returns>
		public static IList<ERPStore.Models.BreadCrumbItem> GetBreadcrumb(this UrlHelper helper, ERPStore.Models.ProductList search)
		{
			var result = helper.CreateDefaultBreadcrumb();
			result.Add(new ERPStore.Models.BreadCrumbItem()
			{
				Title =	search.Query, 
				Url = helper.RouteERPStoreUrl(ERPStoreRoutes.PRODUCT_SEARCH, new { s = helper.Encode(search.Query) }),
				Type = "Search",
			});

			return result;
		}

		private static IList<ERPStore.Models.BreadCrumbItem> CreateDefaultBreadcrumb(this UrlHelper helper)
		{
			var result = new List<ERPStore.Models.BreadCrumbItem>();
			result.Add(new ERPStore.Models.BreadCrumbItem()
			{
				Title = "Accueil",
				Url = helper.HomeHref(),
				Description = ERPStore.GlobalConfiguration.Configuration.Settings.SiteName,
				Type = "Home",
			});
			return result;
		}
	}
}
